package com.class04.jsp;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassDescription:
 * @JdkVersion: 17
 * @Author: yxy
 * @Created: 2023/12/6 14:40
 */
@Controller
@RequestMapping("jsp")
//@ResponseBody
public class JspController {
    /**
     * todo 快速查找视图
     * 1.方法的返回值是字符串
     * 2.不能添加@ResponseBody ，直接返回字符串给浏览器，
     * 不找视图，不走视图解析器
     * 3.返回值  对应中间的视图名称即可
     *  jsp/index
     * @param request
     * @return
     */
    @GetMapping("index")
    public String index(HttpServletRequest request) {
        request.setAttribute("data", "hello");
        return "index";
    }

    @GetMapping("getModelMap")
    public String model(ModelMap modelMap) {
       modelMap.put("haha","xiaopangniu");
        return "index";
    }


    @RequestMapping("getModel")
    public String data1(Model model) {
        // 我们将数据存入模型，SpringMVC 会帮我们把模型数据存入请求域
        // 存入请求域这个动作也被称为暴露到请求域 request
        model.addAttribute("requestScopeMessageModel", "i am very happy[model]");

        System.out.println(model);
        return "target";
    }

    @RequestMapping("getMap")
    public String data3(Map map){
        map.put("key","getMap");//request
        return "target";

    }

    @RequestMapping("getModelAndView")
    public ModelAndView data4(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("key","getModelAndView");
        modelAndView.setViewName("target");
        return modelAndView;
    }

    @GetMapping("forword")//原生api实现转发
    public void forword(HttpServletRequest request,HttpServletResponse response){

        try {
            List<String> list = new ArrayList<>();
            String requestURI = request.getRequestURI();
            list.add(requestURI);
            String contextPath = request.getContextPath();
            list.add(contextPath);
            String method = request.getMethod();
            list.add(method);
            request.setAttribute("uri",list);

            request.getRequestDispatcher("index").forward(request,response);

        } catch (ServletException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
    /**
     * 转发：只能是项目下的资源
     * 1.方法的返回值写成字符串
     * 2.不能添加responseBody注解
     * 3.返回的字符串 farward: /转发地址
     */
    @GetMapping("forward1")
    public String forword1(HttpSession session){
        session.setAttribute("xiaopangniu","xiaopangniu");
        return "forward:index";
    }
    /**
     * 重定向：
     * 1.方法返回值写成字符串类型
       2.不能添加responseBody注解
     * 3.返回的字符串 redirect: /重定向的地址
     */
    /**
     * 路径细节：[不要使用springmvc request response]
     * 1、转发是项目下的资源跳转。路径：项目下的地址 /jsp/index
     * 忽略 applicationContext。
     * 2、重定向项目下的资源可以是项目外的地址  重定向属于二次请求  路径：项目下的地址
     * 全地址   /springmvc/jsp/index
     * 3.使用springmvc路径语法：
     * "forward:路径  |  redirect:路径  重定向，资源地址也不需要写项目的跟路径！/jsp/index"
     * 转发和重定向的地址都不一样了！
     * /springmvc/jsp/index
     *
     *
     *
     * http://localhost:8080/jsp/forward1
     * localhost ->  127.0.0.1
     * 协议：ip：端口/项目名/类路径/方法路径
     *
     */
    @GetMapping("redirect1")//使用原生api方式实现重定向
    public void redirect1(HttpServletResponse response){
        try {

            response.sendRedirect("https://www.baidu.com/");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    @GetMapping("redirect2")//使用springmvc方式实现重定向
    public String redirect2(){
        return "redirect:index";
    }

    @GetMapping("redirect3")//使用springmvc方式实现重定向
    public String redirect3(){
        return "redirect:https://www.baidu.com/";
    }


}
